/**
 * Created by jiachenpan on 16/11/18.
 */

export function isNull (value) {
  if (value === '' || value == null || value === undefined) {
    return true
  }
  return false
}

export function isvalidUsername (str) {
  const reg = /^[a-zA-Z0-9_]{4,20}$/
  return reg.test(str)
}

/* 合法uri */
export function validateURL (textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

/* 小写字母 */
export function validateLowerCase (str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/* 大写字母 */
export function validateUpperCase (str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/* 大小写字母 */
export function validateAlphabets (str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/* 电子邮箱 */
export function validateEmail (rule, value, callback) {
  const reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  if (reg.test(value)) {
    return callback()
  }
  callback(new Error('请输入合法的邮箱'))
}

/* 手机号码 */
export function validatePhone (rule, value, callback) {
  const reg = /^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9|1])\d{8}$/
  if (reg.test(value)) {
    return callback()
  }
  callback(new Error('请输入合法的手机号'))
}

/* 固定电话 */
export function validateTelephone (str) {
  return /^\d{3}-\d{8}|\d{4}-\d{7}$/.test(str) || /^400[0-9]{7}/.test(str) || /^800[0-9]{7}/.test(str) || /^955[0-9]{2}/.test(str)
}

/* 身份证 */
export function validateIdentityCard (str) {
  const reg = /^((\d{18})|([0-9X]{18}))$/
  if (reg.test(str)) {
    if (str.length === 18) {
      const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 将前17位加权因子保存在数组里
      const idCardY = ['1', '0', '10', '9', '8', '7', '6', '5', '4', '3', '2'] // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
      let idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
      for (var i = 0; i < 17; i++) {
        idCardWiSum += str.substring(i, i + 1) * idCardWi[i]
      }
      var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
      var idCardLast = str.substring(17) // 得到最后一位身份证号码
      // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
      if (idCardMod === 2) {
        if (idCardLast === 'X') {
          return true
        } else {
          return false
        }
      } else {
        // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
        if (idCardLast === idCardY[idCardMod]) {
          return true
        } else {
          return false
        }
      }
    }
    return false
  }
  return false
}

/* 密码 */
export function validatePassword (str) {
  const reg = /^[a-zA-Z]\w{5,17}$/
  return reg.test(str)
}

/* 中文 */
export function validateZh (str) {
  const reg = /^[\u4e00-\u9fa5]$/
  return reg.test(str)
}

/* 银行卡 */
export function validateAccountNo (str) {
  const reg = /^\d{15}|\d{19}$/
  return reg.test(str)
}

/* 名字 */
export function validateName (str) {
  const reg = /^([\u4e00-\u9fa5]+|([a-z]+s?)+)$/
  return reg.test(str)
}
/* 邮政编码 */
export function validatePostcode (str) {
  const reg = /^[1-9]\d{5}(?!\d)$/
  return reg.test(str)
}

/* IP地址 */
export function validateIP (str) {
  const reg = /^((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))$/
  return reg.test(str)
}

/* 统一社会信用代码 */
export function validateCreditCode (str) {
  const reg = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
  return reg.test(str)
}

/* 银行卡代码 */
export function validateBankCard (str) {
  const reg = /^([1-9]{1})(\d{14}|\d{18})$/
  return reg.test(str)
}

export const validates = {
  isvalidUsername: isvalidUsername,
  validateURL: validateURL,
  validateLowerCase: validateLowerCase,
  validateUpperCase: validateUpperCase,
  validateAlphabets: validateAlphabets,
  validateEmail: validateEmail,
  validatePhone: validatePhone,
  validateTelephone: validateTelephone,
  validateIdentityCard: validateIdentityCard,
  validatePassword: validatePassword,
  validateZh: validateZh,
  validateName: validateName,
  validatePostcode: validatePostcode,
  validateIP: validateIP,
  validateAccountNo: validateAccountNo,
  validateCreditCode: validateCreditCode,
  validateBankCard: validateBankCard,
  isNull: isNull
}
